了解設計原則主要可以帶來兩個好處
可以寫出比較好的程式碼
能夠判斷程式碼的好壞
SOLID 簡介
SOLID設計原則的好處
- 降低程式碼複雜程度
- 增加程式碼的可讀性
- 提升模組的可重複利用性
- 讓模組具有相對高內聚力、低耦合力
- 面臨變更需求時可減少破壞現有模組的風險
SOLID 五大原則:
- 單一責任原則 SRP - Single Responsibility Principle
- 開放封閉原則 OCP - Open Closed Principle
- 里氏替換原則 LSP - Liskov Substitution Principle
- 介面隔離原則 ISP - Interface Segregation Principle
- 相依反轉原則 DIP - Dependency Inversion Principle
在談 SOLID 五大原則之前,先來談談「內聚力 Cohesion」跟「耦合力 Coupling」,首先我們先定義接下來討論的內聚力跟耦合力都是針對「模組 Module」來討論。
何謂模組 Module?
- 可能是一個 Class
- 可能是一個 Method
- 可能是一個 Assembly
內聚力 Cohesion
在一個「模組內」完成「一件工作」的一種度量指標
要盡量設計「高內聚力」的程式碼
高內聚力
在一個「模組 Module」內只完成一項工作
內聚力高,代表該模組可以獨立運作的能力高,也就代表更容易重複利用
ex.一個 method 只負責一件事情像是寄email、驗證傳入的值是否有效
低內聚力
在一個「模組 Module」內完成多項工作
內聚力低,代表該模組做太多工作,會造成難以維護、測試、重用、理解
ex.所有功能寫在一個 class 裡或是一個 method 有 5000 行程式碼
內聚力最佳實務
實現「SRP」就是實現「提高內聚力」的一種表現
設計模組的時候要盡量設計「高內聚力」的程式碼
若要在一個模組內完成多項工作,建議拆成數個不同的類別
耦合力 Coupling
模組與模組之間的關聯強度
模組之間相互依賴的程度
在 Class B裡面直接建立了 Class A的物件實體就會建立 Class A 和 Class B 的耦合關係
要盡量設計「低耦合力」的程式碼
高耦合力
以上面的例子來說,高耦合力代表改了 Class A 的時候,相關聯的 Class B 就容易受影響 (改A壞B)
低耦合力
修改模組的時候,有越少的模組被影響就代表其耦合力越低
耦合力最佳實務
實現「DIP」就是實現「降低耦合力」的一種表現
設計模組的時候要盡量設計「低耦合力」的程式碼
總結
最理想狀況下應該要設計出「高內聚力」&「低耦合力」的程式碼,但這兩件事情其實是互斥的,怎麼說呢?
高內聚力,意味者我一次只做一件事情,但現實中系統是很複雜的,這時候就會建立很多 Class ,而 Class 多就意味者耦合力高,因為你需要呼叫各種不同的 Class ,彼此之間的耦合就變高了。
低耦合力,意味者我不跟其他模組有關聯,這在複雜的系統中就代表著你一隻 Class 做所有事情,這時候內聚力就低了。
所以在實務中,我們需要一些原則來達成內聚力和耦合力的平衡,而接下來要討論的 SOLID 設計原則就是為了解決這件事情。